package ReentrantLock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @功能
 * @创建时间 2019/12/19
 * 使用ReentrantLock可以进行'尝试锁定'trylock,这样无法锁定，或者在指定的时间内无法锁定，线程可以决定是否继续等待
 * 使用
 */
public class ReentrantLock3 {
    Lock lock = new ReentrantLock();
    void m1(){
        try {
            lock.tryLock();
            for(int i = 0;i<10;i++){
                TimeUnit.SECONDS.sleep(1);
                System.out.println(i);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    /*
    使用trylock进行尝试锁定，不管锁定与否，方法都继续执行
    可以根据trylock的返回值进行判定是否锁定
    也可以指定trylock的时间，由于trylock（time）抛出异常，所以要注意unlock的处理，必须放到finally中
     */
    void m2(){
       /* boolean locked = lock.tryLock();
        System.out.println("m2..."+locked);
        if(locked)lock.unlock();*/
       boolean locked = false;
       try {
           locked = lock.tryLock(10,TimeUnit.SECONDS);
           System.out.println("m2"+locked);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }finally {
           if(locked)
               lock.unlock();
       }
    }

    public static void main(String[] args) {
        ReentrantLock3 r1 = new ReentrantLock3();
        new Thread(r1::m1).start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(r1::m2).start();
    }
}
